/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Centrala;

import com.vividsolutions.jts.geom.Point;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import marcin.belzowski.uslugi.Kierowca;
import marcin.belzowski.uslugi.Klient;
import marcin.belzowski.uslugi.Samochod;
import marcin.belzowski.uslugi.Zamowienie;
import marcin.belzowski.uslugi.Zlecenie;

/**
 *
 * @author Marcin
 */
@Stateless
public class Dyspozytor implements DyspozytorRemote {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("FirmaPU");
    EntityManager em = emf.createEntityManager();

    public List<marcin.belzowski.uslugi.Dyspozytor> wyszukaj(String login, String haslo) {
        Query q = em.createQuery("select d from Dyspozytor d where d.login = ?1 and d.haslo = ?2");
        q.setParameter(1, login);
        q.setParameter(2, haslo);
        List<marcin.belzowski.uslugi.Dyspozytor> l = q.getResultList();

        return l;
    }

    //utrwala obiekt klient w bazie danych
    //jeżeli jeszcze w bazie nie istnieje
    //obiekty których imię i nazwisko jest takie samo są takie same
    //
    public Klient zapisz(Klient klient) {
        Query q = em.createQuery("select k from Klient k where k.imie = ?1 and k.nazwisko = ?2");
        q.setParameter(1, klient.getImie());
        q.setParameter(2, klient.getNazwisko());
        List<Klient> list = q.getResultList();
        if (list.size() < 1) {
            em.getTransaction().begin();
            em.persist(klient);
            em.getTransaction().commit();

            return (Klient) q.getResultList().get(0);
        } else {
            return list.get(0);
        }
    }

    public List<Klient> wyszukaj(Klient klient) {
        Query q = em.createQuery("select k from Klient k where k.imie = ?1 and k.nazwisko = ?2");
        q.setParameter(1, klient.getImie());
        q.setParameter(2, klient.getNazwisko());
        return q.getResultList();
    }

    public Zamowienie zapisz(Zamowienie zamowienie, Klient klient, marcin.belzowski.uslugi.Dyspozytor dyspozytor) {

        Klient k = em.getReference(Klient.class, klient.getId());
        marcin.belzowski.uslugi.Dyspozytor d = em.getReference(marcin.belzowski.uslugi.Dyspozytor.class, dyspozytor.getId());
        k.dodaj(zamowienie);
        d.dodaj(zamowienie);
        em.getTransaction().begin();
        em.persist(zamowienie);

        Query q = em.createQuery("select z from Zamowienie z where z.klient =?1  and z.dyspozytor = ?2");
        q.setParameter(1, k);
        q.setParameter(2, dyspozytor);


        em.getTransaction().commit();
        return (Zamowienie) q.getResultList().get(q.getResultList().size() - 1);
    }

    public List<Kierowca> wyszukaj(Kierowca kierowca) {
        Query q = em.createQuery("select k from Kierowca k where k.imie = ?1 and k.nazwisko = ?2 and k.haslo = ?3");
        q.setParameter(1, kierowca.getImie());
        q.setParameter(2, kierowca.getNazwisko());
        q.setParameter(3, kierowca.getHaslo());
        List<Kierowca> list = q.getResultList();
        for (Kierowca k : list) {
            k.getZlecenia();

        }


        return q.getResultList();
    }

    public List<Zlecenie> wyszukajZlecenie(Kierowca kierowca) {
        Query q = em.createQuery("select k from Kierowca k  where  k.imie = ?1 and k.nazwisko = ?2 and k.haslo = ?3");
        q.setParameter(1, kierowca.getImie());
        q.setParameter(2, kierowca.getNazwisko());
        q.setParameter(3, kierowca.getHaslo());
        List<Kierowca> list = q.getResultList();
        Query qZ = em.createQuery("select z from Zlecenie z where z.kierowca = ?1 and z.zrealizowane = false");
        qZ.setParameter(1, list.get(0));

        for (Kierowca k : list) {
            List<Zlecenie> lz = k.getZlecenia();
        }



        return qZ.getResultList();
    }

    public void zapiszPolozenie(Point polozenie, Kierowca kierowca) {
        Kierowca kier = em.getReference(Kierowca.class, kierowca.getId());
        Samochod samochod = em.getReference(Samochod.class, kier.getSamochod().getId());
        samochod.setPolozenie(polozenie);
        samochod.setWolny(kierowca.getSamochod().isWolny());
        em.getTransaction().begin();
        em.persist(samochod);
        em.getTransaction().commit();
    }

    public List<Kierowca> getAllKierowcy() {
        Query q = em.createQuery("select k from Kierowca k ");

        return q.getResultList();

    }

    public void zapisz(Zlecenie zlecenie) {
        Zamowienie zamowienie = em.getReference(Zamowienie.class, zlecenie.getZamowienie().getId());
        Kierowca kierowca = em.getReference(Kierowca.class, zlecenie.getKierowca().getId());
        Zlecenie z;
        if (zlecenie.getId() == null) {
            z = new Zlecenie(kierowca, zamowienie);
        } else {
            z = em.getReference(Zlecenie.class, zlecenie.getId());
        }
        z.setPunktKońcowy(zlecenie.getPunktKońcowy());
        if (zlecenie.getPunktPoczątkowy() != null) {
            z.setPunktPoczątkowy(zlecenie.getPunktPoczątkowy());
        }
        z.setZrealizowane(zlecenie.isZrealizowane());
        kierowca.dodaj(z);
//        zamowienie.setZlecenie(zlecenie);
        em.getTransaction().begin();

        em.persist(kierowca);
        em.persist(z);

        em.getTransaction().commit();
    }

    public void zakonczZlecenie(Zlecenie zlecenie) {
        Zamowienie zamowienie = em.getReference(Zamowienie.class, zlecenie.getZamowienie().getId());
        Kierowca kierowca = em.getReference(Kierowca.class, zlecenie.getKierowca().getId());
        Zlecenie z;
        if (zlecenie.getId() == null) {
            z = new Zlecenie(kierowca, zamowienie);
        } else {
            z = em.getReference(Zlecenie.class, zlecenie.getId());
        }
        z.setPunktKońcowy(zlecenie.getPunktKońcowy());
        if (zlecenie.getPunktPoczątkowy() != null) {
            z.setPunktPoczątkowy(zlecenie.getPunktPoczątkowy());
        }
        z.setZrealizowane(zlecenie.isZrealizowane());
        z.setDlugosKursu(zlecenie.getDlugosKursu());
        z.setWartosc(zlecenie.getWartosc());
        z.setStawka(zlecenie.getStawka());
        kierowca.dodaj(z);

        em.getTransaction().begin();

        em.persist(kierowca);
        em.persist(z);

        em.getTransaction().commit();
    }

    public List<Kierowca> getAllFreeKierowcy() {
        Query q = em.createQuery("select k from Kierowca k ");
        List<Kierowca> list = q.getResultList();
        List<Kierowca> freeKierowcy = new ArrayList<Kierowca>();
        for (Kierowca k : list) {
            if (k.getSamochod().isWolny()) {
                freeKierowcy.add(k);
            }
        }
        return freeKierowcy;
    }

    public Kierowca pobierzStatystyki(String imie, String nazwisko) {
        Query q = em.createQuery("select k from Kierowca k join fetch k.zlecenia where k.imie =?1 and k.nazwisko = ?2");
        q.setParameter(1, imie);
        q.setParameter(2, nazwisko);
        
        if (q.getResultList().size() != 0 )
        return (Kierowca) q.getSingleResult();
        else return null;
    }
}
